home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 051-075 / 074 / less / io.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  3KB  |  155 lines

  1. /*  io.c */
  2.  
  3. #include <ctype.h>
  4.  
  5. /*
  6.  * Name:    MicroEMACS
  7.  *        AmigaDOS terminal I/O
  8.  * Version:    31
  9.  * Compiler:    Manx Aztec C
  10.  * Created:    19-Apr-86 ...!ihnp4!seismo!ut-sally!ut-ngp!mic
  11.  */
  12. #include    <libraries/dos.h>
  13. #include    <libraries/dosextens.h>
  14. #undef TRUE
  15. #undef FALSE
  16.  
  17. #define    NIBUF    128        /* Probably excessive.        */
  18. #define    NOBUF    512        /* Not too big for 750/730.    */
  19.  
  20. struct    FileHandle    *tty;
  21. struct    FileHandle    *Open();
  22. char    obuf[NOBUF];    /* Output buffer        */
  23. int    nobuf;                /* # of bytes in above        */
  24. char    ibuf[NIBUF];    /* Input buffer            */
  25. int    nibuf;                /* # of bytes in above        */
  26. int    nrow = 0;                /* Terminal size, rows.        */
  27. int    ncol;                /* Terminal size, columns.    */
  28.  
  29.  
  30. extern char version[];
  31.  
  32. /*
  33.  * This routine gets called once, to set up the
  34.  * terminal channel.
  35.  */
  36. ttopen()
  37. {
  38.     char WindowName[80];
  39.  
  40.     if(nrow) return;
  41.     
  42.     nrow = 23;
  43.     ncol = 77;
  44.     nobuf = nibuf = 0;
  45.  
  46.     strcpy(WindowName,"RAW:0/0/640/200/");
  47.     strcat(WindowName, version);
  48.     tty = Open(WindowName, MODE_NEWFILE);
  49.     if (tty == (struct FileHandle *) 0) {
  50.         printf("Can't open window!\n");
  51.         exit(200);
  52.     }
  53. }
  54.  
  55. _abort()
  56. {
  57.     ttclose();
  58.     exit(0);   
  59. }
  60.  
  61.  
  62. /*
  63.  * This function gets called just
  64.  * before we go back home to the command interpreter.
  65.  * On the Amiga it closes up the virtual terminal window.
  66.  */
  67. ttclose()
  68. {
  69.     if (tty != (struct FileHandle *) 0L) {
  70.         ttflush();
  71.         Close(tty);
  72.     }
  73.     tty = /*(struct FileHandle *)*/ NULL;
  74. }
  75.  
  76. /*
  77.  * Write a character to the display.
  78.  * On the Amiga, terminal output is buffered, and
  79.  * we just put the characters in the big array,
  80.  * after cheching for overflow.
  81.  */
  82. ttputc(c)
  83. {
  84.     if (nobuf >= NOBUF)
  85.         ttflush();
  86.     obuf[nobuf++] = c;
  87. }
  88.  
  89. /*
  90.  * This function does the real work of
  91.  * flushing out buffered I/O on the Amiga. All
  92.  * we do is blast out the block with a write call.
  93.  */
  94. ttflush()
  95. {
  96.     if (nobuf > 0) {
  97.         Write(tty, obuf, (long) nobuf);
  98.         nobuf = 0;
  99.     }
  100. }
  101.  
  102. /*
  103.  * Read a character from the terminal,
  104.  * performing no editing and doing conditional echo 
  105.  */
  106. int do_echo = 1; /* echo flag */
  107.  
  108. ttgetc()
  109. {
  110.     unsigned char c, ignore;    /* must be unsigned! */
  111.  
  112.     ttflush();
  113.  
  114.     Read(tty,&c,1L);
  115.     if (c == '\x9b') {
  116.         Read(tty, &c, 1L);
  117.  
  118.         /* was it a function key  */
  119.         if (isdigit(c) || c == '?')
  120.             Read(tty, &ignore, 1L);
  121.  
  122.         /* return the char with top bit set */
  123.         c |= 0x80;
  124.     } else 
  125.         if (do_echo) 
  126.             ttputc(c);
  127.  
  128.     return ((int) c);
  129. }
  130.  
  131.  
  132. /*
  133.  * Write a string to the terminal 
  134.  */
  135. ttputs(s)
  136. char *s;
  137. {
  138.     while(*s) ttputc(*s++);
  139.     ttflush();
  140. }
  141.  
  142. /* fake termcap output */
  143. tputs(s, ignore_heigth, ignore_func)
  144. char *s;
  145. int ignore_heigth, ignore_func;
  146. {
  147.     if(nrow == 0)
  148.         ttopen();
  149.  
  150.     flush();  
  151.     while(*s) ttputc(*s++);
  152.     ttflush();
  153. }
  154.  
  155.